-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathComputeExpression.cpp
160 lines (144 loc) · 3.44 KB
/
ComputeExpression.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "ComputeExpression.h"
#include<iostream>
// 算法5.12 表达式树的创建
// 时间复杂度: O(n)
// 空间复杂度: O(n)
void InitExpTree(BiTree &T) {
SqStack OPTR;
BiTreeStack EXPT;
char ch, theta, x;
BiTree a, b;
InitSqStack(OPTR);
Push(OPTR, '#');
InitBiTreeStack(EXPT);
std::cin >> ch;
while (ch != '#' || GetTop(OPTR) != '#') {
if (!In(ch)) {
CreateExpTree(T, nullptr, nullptr, ch);
PushBiTree(EXPT, T);
std::cin >> ch;
} else
switch (Precede(GetTop(OPTR), ch)) {
case '<':
Push(OPTR, ch);
std::cin >> ch;
break;
case '>':
Pop(OPTR, theta);
PopBiTree(EXPT, b);
PopBiTree(EXPT, a);
CreateExpTree(T, a, b, theta); //*
PushBiTree(EXPT, T);
break;
case '=':
Pop(OPTR, x);
std::cin >> ch;
break;
}
}
}
// 算法5.13 表达式树的求值
// 本质: 后序遍历二叉树
// 时间复杂度: O(n)
// 空间复杂度: O(n)
int EvaluateExTree(BiTree T) {
int lvalue, rvalue;
lvalue = rvalue = 0;
if (T->lchild == nullptr && T->rchild == nullptr)
return T->data - '0';
else {
lvalue = EvaluateExTree(T->lchild);
rvalue = EvaluateExTree(T->rchild);
return GetValue(T->data, lvalue, rvalue); // 运算函数
}
}
// 简单二叉树的创建
void CreateExpTree(BiTree &T, BiTree a, BiTree b, char ch) {
T = new BiTNode;
T->data = ch;
T->lchild = a;
T->rchild = b;
}
/* 根据教科书表3.1,判断两符号的优先关系 */
char Precede(char t1, char t2) {
char f;
switch (t2) {
case '+':
if (t1 == '(' || t1 == '#')
f = '<';
else
f = '>';
break;
case '-':
if (t1 == '(' || t1 == '#')
f = '<';
else
f = '>';
break;
case '*':
if (t1 == '*' || t1 == '/' || t1 == ')')
f = '>';
else
f = '<';
break;
case '/':
if (t1 == '*' || t1 == '/' || t1 == ')')
f = '>';
else
f = '<';
break;
case '(':
if (t1 != ')')
f = '<';
break;
case ')':
if (t1 == '(')
f = '=';
else
f = '>';
break;
case '#':
if (t1 == '#')
f = '=';
else
f = '>';
}
return f;
}
/* 判断c是否为运算符 */
int In(char c) {
switch (c) {
case '+':
case '-':
case '*':
case '/':
case '#':
case '(':
case ')':
return 1;
break;
default:
return 0;
}
}
// 进行运算的函数
int GetValue(char theta, int a, int b) {
int c;
switch (theta) {
case '+':
c = a + b;
break;
case '-':
c = a - b;
break;
case '*':
c = a * b;
break;
case '/':
c = a / b;
break;
default:
break;
}
return c;
}